
import { AttrChangeEnum, ItemAttrConfig, UnitAttrStruct } from "../../types/L_Type";
import { I2IDCache } from "../../constant/IdCache";
import EnhItemAttr from "../../entity/EnhItemAttr";
import ItemX from "../../entity/ItemX";
import L_AttrControlUtil from "../../utils/L_AttrControlUtil";
import L_String from "../../utils/L_String";
import L_Run from "../../utils/L_Run";
import PlayerEnhManager, { EnhIndexItemXRel } from "./PlayerEnhManager";
import EnvConfig from "../../config/EnvConfig";
import L_Math from "../../utils/L_Math";
import UnitXManager from "./UnitXManager";
import CycleDepTrg from "../../trigger/CycleDepTrg";



export default class ItemXManager{
 
    private static G_ITEMX:Map<number,ItemX>=new Map();
  
   static showStat(){
    console.log("-------------------")
    console.log(L_String.getObjJSONStr(this.G_ITEMX))
   }

 static validatedItemX(it:item | any):boolean{
    return this.G_ITEMX.has(L_Run.GetHandleId_L(it,0))
 }


 /**
  *  获取itemx 如果不存在利用基础config的配置对象创建一个 并且管理到容器中
  * @param it  物品对象地址item
  * @param extraInitAttr 初始化额外属性 为了高效初始化 没有可以不传
  * @returns 
  */
 static getItemxAutoInitNil(it:item | number,extraInitAttr?:UnitAttrStruct):ItemX{
     let itxArr:[boolean,ItemX]=this.getItemxCheckNew(it,extraInitAttr)
     if(itxArr[0] ){
        this.G_ITEMX.set(itxArr[1].handle,itxArr[1])
        //注册一下itemx物品销毁事件
        CycleDepTrg.itemXDestoryEventInit(itxArr[1].item)
     }
     return itxArr[1]
 }    
 
 /**
  *  直接获取itemx 如果不存在直接使用基础config的配置对象 
  * 不会创建并且管理itemx对象 懒得回收
  * @param it 物品对象地址item
  * @param extraInitAttr 初始化额外属性 为了高效初始化 没有可以不传
  * @returns 
  */
 static getItemxWithOutInitG(it:item,extraInitAttr?:UnitAttrStruct):ItemX{
     return this.getItemxCheckNew(it,extraInitAttr)[1]
 }    

 /**
  * 直接获取itemx 如果不存在直接使用基础config的配置对象 
  * @param it 物品对象地址item
  * @param extraInitAttr 初始化额外属性 为了高效初始化 没有可以不传
  * @returns [boolean,ItemX] [是否没有在全局管理池中的boolean,创建的itemx对象]
  */
 private static getItemxCheckNew(it:item | number,extraInitAttr?:UnitAttrStruct):[boolean,ItemX]{
    let handle:number=L_Run.GetHandleId_L(it,90001)
    let itx=this.G_ITEMX.get(handle)
    let isNew=false
    if ( itx==null ){
       //根据单位类型从配置表获取初始化的配置   I01O->1227895119 
       let configAttr:ItemAttrConfig=L_AttrControlUtil.getItemConfigAttr(I2IDCache(L_Run.GetItemTypeId_L(it,1227895119)))
       let configAttrCp = L_AttrControlUtil.deepCloneAttrStruct(configAttr)
       if(extraInitAttr!=undefined){
           L_AttrControlUtil.mergeField(configAttrCp,extraInitAttr,AttrChangeEnum.INCREASE)
       }
        itx=new ItemX(it,configAttrCp,handle,configAttr.name);
        isNew=true
    }

    return [isNew,itx]
}    


 
 /**注销单位绑定的unitx释放内存 */
 static destoryItemx(it:item){
    this.destoryItemxByItemHandle(L_Run.GetHandleId_L(it,90001))
 }

  /**注销单位绑定的unitx释放内存 */
  static destoryItemxByItemHandle(itemHandle:number){
    if(itemHandle==null || itemHandle==undefined) return
    let itx:ItemX | undefined=this.G_ITEMX.get(itemHandle)
    if(itx!=undefined){
       //通过参数自行判断是否强化物品释放空间
       PlayerEnhManager.destoryEnhItemRel(itx.enhInfo?.enhId || null)
       this.G_ITEMX.delete(itx?.handle);
    }
}

 

 static enhItem(playerid:number,u:unit | any,it:item | any,enhAttr?:UnitAttrStruct):ItemX | null{
    
    let enhIndexObj:EnhIndexItemXRel | null=PlayerEnhManager.getPlayerEnhItemTypeId(playerid)
    if(enhIndexObj==null){
        console.log("enh管理空间耗尽无法继续强化!")
        return null
    }
    let enhBeforObj:ItemX | undefined=this.getItemxAutoInitNil(it)
    if(enhBeforObj==undefined){
        return null
    }
    let itHandle=enhBeforObj.handle
    console.log(">>>>强前的物品,属性:",L_String.getObjJSONStr(enhBeforObj))
    if( enhBeforObj.enhInfo!=undefined){
        //本来就是强化物品 释放管理空间
        PlayerEnhManager.destoryEnhItemRel(enhBeforObj.enhInfo.enhId)
    }else{
        //是新物品 初始化强化信息对象
        enhBeforObj.enhInfo=new EnhItemAttr(enhIndexObj.enhId,I2IDCache(L_Run.GetItemTypeId_L(it,1227895119)))
    }
    //设置当前强化次数
    enhBeforObj.enhInfo.incEnhNum(1)
    
    let itn:item | any
    let itn_itemtypeId:number | undefined
    //移除旧的物品 创建新的物品
    this.destoryItemxByItemHandle(itHandle)
    if(!EnvConfig.devMod){
        RemoveItem( it)  
        console.log("创建强化后的物品,类型:",enhIndexObj.itemTypeId)
        itn_itemtypeId=L_Math.ID2I(enhIndexObj.itemTypeId)
        itn=CreateItem(itn_itemtypeId, 0, 0)
    }else{
        itn=0
    }    
    //先添加物品给单位  此时全局没有itn的ItemX属性管理不会触发获取物品+属性
    if(!EnvConfig.devMod && u!=null) UnitAddItem(u,itn)
    //为单位添加强化属性（特殊处理逻辑）  为了实现只执行一次单位增加强化属性的目的
    UnitXManager.getUnitxAutoInitNil(u).incrUnitAttrs(enhAttr || {})

    //itemx属性和绑定关系设置到新物品上
    enhBeforObj.item=itn
    enhBeforObj.handle=L_Run.GetHandleId_L(itn,90001)
    enhBeforObj.enhInfo.enhId=enhIndexObj.enhId
    //重新关联 G_ITEMX的管理关系
    this.G_ITEMX.set(enhBeforObj.handle,enhBeforObj)
    //最后设置物品真实itemx属性
    L_AttrControlUtil.mergeField(enhBeforObj,enhAttr,AttrChangeEnum.INCREASE);
    console.log(">>>>强化后的物品,属性:",L_String.getObjJSONStr(enhBeforObj))

    console.log("--------------------------")
   // console.log(this.G_ITEMX)
   // console.log("|||||||||ItemXManager:",L_String.getObjJSONStr(this.G_ITEMX))

    //JAPI修改物品描述属性
    // -- 1图片  3内容  4名字?
    // japi.EXSetItemDataString(ID2I(n_item_typeid), 1, enh_itemx.fg_model.art ) 
    // japi.EXSetItemDataString(ID2I(n_item_typeid), 3, getItemFieldStr(enh_itemx) ) 
    // japi.EXSetItemDataString(ID2I(n_item_typeid), 4, "+"..tostring(enh_itemx.enh_n).." "..enh_itemx.name ) 
    if(!EnvConfig.devMod && itn_itemtypeId!=undefined) EXSetItemDataString(itn_itemtypeId, 3, enhBeforObj.getItemxDesc() ) 
    if(!EnvConfig.devMod && itn_itemtypeId!=undefined) EXSetItemDataString(itn_itemtypeId, 4, enhBeforObj.getItemNameWithEnh() ) 

    return enhBeforObj

 }

}